home *** CD-ROM | disk | FTP | other *** search
/ Ultimedia 1 / Ultimedia 1.iso / tools / sonstiges / easysound / iff2src.c < prev    next >
C/C++ Source or Header  |  1994-08-04  |  4KB  |  158 lines

  1. /*
  2.  * Iff2Src - Convert 8svx samples to include files
  3.  *
  4.  * Written in 1993 by Michael Bauer (bauermichael@student.uni-tuebingen.de)
  5.  *
  6.  * This stuff is FreeWare. Use it as your own risk.
  7.  *
  8.  * Compile: dcc -3.0 -// -v -f iff2src.c -o iff2src
  9.  */
  10.  
  11. #include <exec/types.h>
  12. #include <exec/memory.h>
  13. #include <libraries/dos.h>
  14. #include <stdio.h>
  15.  
  16. /// "structures, ..."
  17. struct HEADER {
  18.     UBYTE   Form[4];
  19.     long    length;
  20.     UBYTE   Type[4];
  21. } Header;
  22.  
  23. struct Voice8Header {
  24.     ULONG   oneShotHiSamples;
  25.     ULONG   repeatHiSamples;
  26.     ULONG   samplesPerHiCycle;
  27.     UWORD   samplesPerSec;
  28.     UBYTE   ctOctave;
  29.     UBYTE   sCompression;
  30.     LONG    volume;
  31. } SampleHeader;
  32.  
  33. struct SoundInfo {
  34.     BYTE    *SoundBuffer;
  35.     UWORD   RecordRate;
  36.     ULONG   FileLength;
  37.     UBYTE   channel_bit;
  38. } info;
  39.  
  40. BPTR    file;
  41. UBYTE   chunk[4];
  42. ULONG   pos;
  43. BYTE    *SoundBuffer;
  44. BYTE    *pointer;
  45.  
  46. UBYTE version_tag[] = "\0$VER: IFF2Src V1.0 (5.8.94)";
  47. ///
  48. /// "main"
  49. main(int argc, char *argv[]) {
  50.  
  51.     STRPTR name, infile;
  52.  
  53.     if (argc != 3) {
  54.         puts ("Usage: iff2src infile arrayname > outfile");
  55.         exit (0);
  56.     }
  57.  
  58.     strcpy(infile, argv[1]);
  59.     strcpy(name, argv[2]);
  60.  
  61.     file = Open(infile,MODE_OLDFILE);
  62.     if (!file)
  63.         return (FALSE);
  64.  
  65.     /*
  66.      * Read the Header of the file
  67.      */
  68.     Seek(file,0,OFFSET_BEGINNING);
  69.     Read(file, &Header, sizeof(Header));
  70.  
  71.     /*
  72.      * Take a look at the header to figure out if it really is an 8SVX file
  73.      */
  74.     if (strcmp(Header.Type,"8SVX") != 0) {
  75.         puts("Sorry, that's no 8SVX Sample !");
  76.         Close(file);
  77.         exit(0);
  78.     }
  79.  
  80.     /*
  81.      * Rewind the file, search for the VHDR chunk, jump to the beginning
  82.      * of the header and read the sample data
  83.      */
  84.     Seek(file,0,OFFSET_BEGINNING);
  85.     FindChunk(file,"VHDR");
  86.     Read(file, &chunk, sizeof(chunk));
  87.     Read(file, &SampleHeader, sizeof(SampleHeader));
  88.  
  89.     /*
  90.      * Determine the length of the sample plus the record rate
  91.      */
  92.     info.FileLength=SampleHeader.oneShotHiSamples + SampleHeader.repeatHiSamples;
  93.     info.RecordRate=SampleHeader.samplesPerSec;
  94.  
  95.     /*
  96.      * The old FutureSound files are stored in KHz and have RecordRates
  97.      * < 100.
  98.      */
  99.     if (info.RecordRate < 100) {
  100.         info.RecordRate *= 1000;
  101.     }
  102.  
  103.     /*
  104.      * Allocate Memory for the soundbuffer
  105.      */
  106.     info.SoundBuffer = (BYTE *) AllocMem(info.FileLength,MEMF_CHIP | MEMF_CLEAR);
  107.     if (!(info.SoundBuffer)) {
  108.         puts("Can't allocate memory.");
  109.         Close(file);
  110.         exit(0);
  111.     }
  112.  
  113.     /*
  114.      * Rewind the file, search for the BODY chunk, move to the end of the
  115.      * Data block and read the complete sample data
  116.      */
  117.     Seek(file,0,OFFSET_BEGINNING);
  118.     FindChunk(file,"BODY");
  119.     Read(file, &chunk, sizeof(chunk));
  120.     Read(file, info.SoundBuffer, info.FileLength);
  121.  
  122.     Close(file);
  123.  
  124.     pointer = info.SoundBuffer;
  125.  
  126.     /*
  127.      * Print the array to a file or to stdout.
  128.      */
  129.     printf ("#ifndef EASYSOUND_H\n");
  130.     printf ("#include \"easysound.h\"\n");
  131.     printf ("#endif\n\n");
  132.     printf ("__chip BYTE %s_data[] = {\n", name);
  133.  
  134.     for (pos=0; pos<info.FileLength; pos++) {
  135.         if (pos % 10 == 0) {
  136.             printf("\n    ");
  137.         }
  138.         printf("%d%s", pointer[pos],pos<info.FileLength-1 ? ",  " : " ");
  139.     }
  140.     printf("\n};\n\n");
  141.     
  142.     printf ("struct SoundInfo %s = {\n", name);
  143.     printf ("    %s_data,", name);
  144.     printf ("    %8d,", info.RecordRate);
  145.     printf ("    %8d\n};\n\n", info.FileLength);
  146.  
  147.     FreeMem(info.SoundBuffer,info.FileLength);
  148. }
  149. ///
  150. /// "FindChunk"
  151. FindChunk(BPTR *file, char *searchchunk) {
  152.     while (strcmp(chunk,searchchunk) != 0) {
  153.         Read(file, &chunk, sizeof(chunk));
  154.     }
  155. }
  156. ///
  157.  
  158.